package com.qianfeng.openapi.web.master.controller;

import com.qianfeng.openapi.common.enums.OpenApiEnums;
import com.qianfeng.openapi.web.master.bean.LayUITableVO;
import com.qianfeng.openapi.web.master.bean.LayUITreeVO;
import com.qianfeng.openapi.web.master.bean.ResultVO;
import com.qianfeng.openapi.web.master.pojo.AdminUser;
import com.qianfeng.openapi.web.master.service.AdminUserService;
import com.qianfeng.openapi.web.master.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/sys/user")
@Slf4j
public class SysUserController {

    @Autowired
    private AdminUserService adminUserService;

    /**
     * 分页查询用户信息
     * 请求路径和请求方式
     *
     * - [GET]() http://localhost/sys/user/table
     *
     * 请求参数
     *
     * - page = Integer（默认值为1）
     * - limit = Integer （默认值为5）
     * - realName = String （非必传）
     * - email = String （非必传）
     * - status = Integer （非必传）
     */
    @GetMapping("/table")
    public LayUITableVO table(@RequestParam(defaultValue = "1")Integer page,
                              @RequestParam(defaultValue = "5")Integer limit,
                              String realName, String email, Integer status) throws IOException {
        //1. 封装参数 (Map)
        Map<String,Object> parameters = new HashMap<>();
        parameters.put("page",page);
        parameters.put("limit",limit);
        parameters.put("realName",realName);
        parameters.put("email",email);
        parameters.put("status",status);

        //2. 调用Service查询用户信息,返回LayUITableVO
        LayUITableVO vo = adminUserService.findLayUITableVO(parameters);

        //3. 响应数据
        return vo;
    }


    /**
     * 添加用户信息
     * 请求路径和请求方式
     *
     * - [POST]() http://localhost/sys/user/add
     *
     * 请求参数
     *
     * - email: String（必传项）
     * - password: String（必传项）
     * - realName: String（必传项）
     * - status: Integer（必传项）
     */
    @PostMapping("/add")
    public ResultVO add(@Valid AdminUser adminUser,BindingResult bindingResult) throws IOException {
        //1. 校验参数
        if(bindingResult.hasErrors()){
            log.info("【添加用户信息】 请求参数不合法!!");
            return R.error(OpenApiEnums.REQUEST_PARAMETER_ERROR.getStatus(),bindingResult.getFieldError().getDefaultMessage());
        }

        //2. 调用Service保存
        adminUserService.save(adminUser);

        //3. 响应数据
        return R.ok();
    }


    /**
     * 批量删除用户信息
     * 请求路径和请求方式
     *
     * - [POST]() http://localhost/sys/user/del
     *
     * 请求参数
     *
     * - ids: Integer[]（必传项）
     */
    @PostMapping("/del")
    public ResultVO del(Integer[] ids){
        //1. 校验参数
        if(ids == null || ids.length == 0){
            log.info("【批量删除用户信息】 请求参数不合法 ids = {}", Arrays.toString(ids));
            return R.error(OpenApiEnums.REQUEST_PARAMETER_ERROR.getStatus(),"用户的标识ids为必传项,岂能为空!");
        }

        //2. 调用Service删除
        adminUserService.del(ids);

        //3. 响应数据
        return R.ok();
    }


    /**
     * 查看用户角色信息
     * 请求路径和请求方式
     *
     * - [POST]() http://localhost/sys/user/userrole
     *
     * 请求参数
     *
     * - userId = Integer （必传项）
     */
    @PostMapping("/userrole")
    public ResultVO userRole(Integer userId){
        //1. 校验参数
        if(userId == null){
            log.info("【查看用户角色信息】 请求参数不合法 userId = {}", userId);
            return R.error(OpenApiEnums.REQUEST_PARAMETER_ERROR.getStatus(),"用户的标识id为必传项,岂能为空!");
        }

        //2. 调用service要data
        List<LayUITreeVO> data = adminUserService.findRolesByUserId(userId);

        //3. 响应数据
        return R.ok(data);
    }


    /**
     * 修改用户权限
     * 请求路径和请求方式
     *
     * - [POST]() http://localhost/sys/user/roles
     *
     * 请求参数
     *
     * - userId = Integer（必传项）
     * - roleId = Integer[] （不是必传项）
     */
    @PostMapping("/roles")
    public ResultVO roles(Integer userId,Integer[] roleId){
        //1. 校验参数
        if(userId == null){
            log.info("【修改用户角色信息】 请求参数不合法 userId = {}", userId);
            return R.error(OpenApiEnums.REQUEST_PARAMETER_ERROR.getStatus(),"用户的标识id为必传项,岂能为空!");
        }

        //2. 调用service实现授权操作
        adminUserService.roles(userId,roleId);

        //3. 响应数据
        return R.ok();
    }

}
